#include<string>//main函数
#include<iostream>
#include<fstream>
using namespace std;
#include "student.h"
#include<map>


//Main函数中实现小车信息录入、分配、保存和屏幕显示



int main()
{
    // 用Student类的数组 实现n个学生信息录入 并保存至student.txt文件 然后检测打印信息功能是否能实现
    cout<<"##########首先进行学生信息的录入###########"<<endl;
    cout<<"请输入要录入的学生人数：";
    int num_stu;
    cin>>num_stu;
    Student stu[num_stu];

    for(int i=0;i<num_stu;i++)
    {
        string name,id;
        cout<<"请输入学生姓名：";
        cin>>name;
        cout<<"请输入学生学号：";
        cin>>id;
        stu[i].setid(id);
        stu[i].setname(name);
        stu[i].save();
    }
    cout<<"学生信息录入完毕！！！"<<endl;
    cout<<"是否要检测输出学生信息的打印功能：[Y/n]";
    string question_stu;
    cin>>question_stu;
    if(question_stu=="Y")
    {
        for(int i=0;i<num_stu;i++)
        {
            cout<<"第"<<i<<"个学生的信息如下："<<endl;
            stu[i].print();
        }
    }


    // 用小车SmartCar类数组 实现n个小车动态信息录入 并保存至dynamicInformation_of_id.txt文件 然后检测打印信息功能是否能实现
    cout<<"##########接下来进行小车动态信息的录入###########"<<endl;
    cout<<"请输入要录入的小车数量：";
    int number_of_car;
    cin>>number_of_car;
    SmartCar smtc[number_of_car];

    for(int i=0;i<number_of_car;i++)
    {
        string _carid,_panid;
        cout<<"请输入小车编号（请输入11位数字和字母组成的编号）：";
        cin>>_carid;
        cout<<"请输入底盘编号（请输入6位数字和字母组成的编号）：";
        cin>>_panid;
        smtc[i].setID("cqusn"+ _carid,"dp"+ _panid);
        smtc[i].save();
    }
    cout<<"小车动态/编号信息录入完毕！！！"<<endl;
    cout<<"是否要检测输出小车动态信息的打印功能：建议选n，等后面一起输出所有信息[Y/n]";
    string question_car;
    cin>>question_car;
    if(question_car=="Y")
    {
        for(int i=0;i<num_stu;i++)
        {
            cout<<"第"<<i<<"个小车的动态信息（编号）如下："<<endl;
            smtc[i].print();
        }
    }



    // 用小车各个组件的类 实现每个小车统一的静态信息录入 并保存至staticInformation_of_car.txt文件 然后检测打印信息功能是否能实现
    
    cout<<"##########接下来是小车静态信息录入###############"<<endl;
    Underpan underpan;
    string underpanInformation;//所有参数都是string类型，输入时带单位，这样就可以在这里方便点；
    AGXKits aGXKits;
    string aGXKitsInformation;
    BinocularCamera binocularCamera;
    string binocularCameraInformation;
    LiDAR liDAR;
    string liDARInformation;
    Gyroscope gyroscope;
    string gyroscopeInformation;
    LCD lcd;
    string lcdInformation;
    BatteryModule batteryModule;
    string batteryModuleInformation;// 如果下面操作正常完成，则完成报告第二问要求的小车信息录入
    cout<<"-------------接下来请根据提示输入这批小车 除编号外的基础信息(静态信息)--------------"<<endl;
    cout<<"(1)小车及底盘的编号已录入完毕"<<endl<<"(2)底盘+轮胎信息录入（系统待完善，输入时请自带参数单位）："<<endl;
    cout<< "型号是：" ;cin>> underpanInformation;underpan.setmodel( underpanInformation);
    cout<< "轴距是: " ;cin>>underpanInformation;underpan.setwheelBase( underpanInformation); 
    cout<< "轮距是: " ;cin>>underpanInformation;underpan.setAxleTrack( underpanInformation); 
    cout<< "最小离地间隙是：" ;cin>>underpanInformation;underpan.setgroundClearance( underpanInformation);  
    cout<< "最小转弯半径是：" ;cin>>underpanInformation;underpan.setminimumBendingRadius( underpanInformation); 
    cout<< "驱动形式是：" ;cin>>underpanInformation;underpan.setdriveForm( underpanInformation);
    cout<< "最大行程是：" ;cin>>underpanInformation;underpan.setbatteryLife( underpanInformation);
    cout<< "轮胎型号是：" ;cin>>underpanInformation;underpan.settireModel( underpanInformation); 
    cout<< "轮胎尺寸是：" ;cin>>underpanInformation;underpan.settireSize( underpanInformation); 
    cout<<"(3)AGX套件信息录入："<<endl;
    cout<< "AGX组件的型号是：" ;cin>>aGXKitsInformation;aGXKits.setmodel(aGXKitsInformation); 
    cout<< "AI是：" ;cin>>aGXKitsInformation;aGXKits.setAIHashrate(aGXKitsInformation);
    cout<< "CUDA核心是：" ;cin>>aGXKitsInformation;aGXKits.setCUDACoreNum(aGXKitsInformation);
    cout<< "Tensor CORE是：" ;cin>>aGXKitsInformation;aGXKits.settensorCORE(aGXKitsInformation);
    cout<< "显存是：" ;cin>>aGXKitsInformation;aGXKits.setmemory(aGXKitsInformation);
    cout<< "存储是：" ;cin>>aGXKitsInformation;aGXKits.setstorage(aGXKitsInformation);
    cout<<"(4)双目摄像头信息录入："<<endl;
    cout<< "双目摄像机的型号是：" ;cin>>binocularCameraInformation;binocularCamera.setmodel(binocularCameraInformation) ;
    cout<< "摄像头是：";cin>>binocularCameraInformation; binocularCamera.setcamera(binocularCameraInformation) ;
    cout<< "RGB帧分辨率是：" ;cin>>binocularCameraInformation;binocularCamera.setRGBFrameResolution(binocularCameraInformation) ;
    cout<< "RGB帧率是：" ;cin>>binocularCameraInformation;binocularCamera.setRGBFramRate(binocularCameraInformation) ;
    cout<< "FOV是：" ;cin>>binocularCameraInformation;binocularCamera.setFOV(binocularCameraInformation) ;
    cout<< "深度帧率是：" ;cin>>binocularCameraInformation;binocularCamera.setframeRateOfDepth(binocularCameraInformation) ;
    cout<<"(5)多线激光雷达信息录入："<<endl;
    cout<< "激光雷达的型号是：" ;cin>>liDARInformation;liDAR.setmodel(liDARInformation);
    cout<< "通道数是：" ;cin>>liDARInformation;liDAR.setchannelNumber(liDARInformation);
    cout<< "测试范围是：" ;cin>>liDARInformation; liDAR.settestScope(liDARInformation);
    cout<< "功耗是：" ;cin>>liDARInformation; liDAR.setpower(liDARInformation);
    cout<<"(6)9轴陀螺仪信息录入："<<endl;
    cout<< "陀螺仪的型号是：";cin>>gyroscopeInformation;gyroscope.setmodel(gyroscopeInformation);
    cout<< "厂商是：" ;cin>>gyroscopeInformation;gyroscope.setbrand(gyroscopeInformation);
    cout<<"(7)液晶显示屏信息录入："<<endl;
    cout<< "液晶显示屏的型号是：" ;cin>>lcdInformation; lcd.setmodel(lcdInformation);
    cout<< "尺寸是：" ;cin>>lcdInformation; lcd.setsize(lcdInformation);
    cout<<"(8)电池模块信息录入："<<endl;
    cout<< "电池模组的参数是：" ;cin>>batteryModuleInformation; batteryModule.setparameter(batteryModuleInformation);
    cout<< "对外供电是：" ;cin>>batteryModuleInformation;batteryModule.setexternalPowerSupply(batteryModuleInformation);
    cout<< "充电时间是：" ;cin>>batteryModuleInformation; batteryModule.setchargeTime(batteryModuleInformation);
    underpan.save();
    aGXKits.save();
    binocularCamera.save();
    liDAR.save();
    gyroscope.save();
    lcd.save();
    batteryModule.save();
    cout<<"小车各组件的静态信息录入完毕！！！"<<endl;
    cout<<"是否要检测输出小车所有信息的打印功能：将输出所有小车的信息！[Y/n]";
    string question_car_all;
    cin>>question_car_all;
    if(question_car_all=="Y")
    {
        for(int i=0;i<number_of_car;i++)
        {
            cout<<"第"<<i<<"个小车的动态信息（编号）如下："<<endl;
            smtc[i].print();
            underpan.print();
            aGXKits.print();
            binocularCamera.print();
            liDAR.print();
            gyroscope.print();
            lcd.print();
            batteryModule.print();//如果这里都能正常显示，则已完成实践报告中第3小题的要求；“3.小车各模块的保存和显示分别通过相应对象的操作完成”
        }
    }


    // 实现小车分配 并将分配信息保存至student_car.txt文件 然后根据文件实现按n显示下一小车详细信息及分配信息，按p显示上一辆；
    cout<<"############接下来进行小车的分配##############"<<endl;
    map<string,SmartCar> v1;
    map<string,Student> v;
    ifstream fin("student.txt");
    int j=0;
    
    while(!fin.eof())// 学生id与学生类对象之间的映射
    {
        Student stu1;
        string stu_id,stu_name;
        fin>>stu_id>>stu_name;
        stu1.setid(stu_id);
        stu1.setname(stu_name);
        v[stu_id]=stu1;
    }
    fin.close();
    ifstream fin1("dynamicInformation_of_id.txt");
    while(!fin1.eof())// 小车编号与类对象的映射
    {
        SmartCar s;
        string s_carid,s_panid;
        fin1>>s_carid>>s_panid;
        s.setID(s_carid,s_panid);
        v1[s_carid]=s;
    }
    fin1.close();

    map<string,BindCS> v3;// 小车编号 与 分配给的学生和小车的结合体 之间的映射
    string allocated_car[number_of_car];
    cout<<"(系统还待完善，目前系统默认先一次性完成所有小车(number_of_car="<<number_of_car<<")的分配，再查看分配信息)"<<endl;
    ofstream fout2("student_car.txt");
    for(int a=0;a<number_of_car;a++)
    {
        cout<<"请输入想要分配的小车16位完整编号：";//v1  fin>>s.carid>>s.panid;v1[s.carid]=s;
        string id2;
        cin>>id2;
        cout<<"请输入想要分配给的学生学号：";//v  Student s;fin>>s.name>>s.id;v[s.id]=s;
        string id3;
        cin>>id3;
        BindCS binCS;
        binCS.smartCar=v1[id2];
        binCS.student=v[id3];
        v3[id2]=binCS;
        allocated_car[a]=id2;
        ofstream fout2("student_car.txt",ios::app);
        string _id =binCS.student.getid();
        string _name =binCS.student.getname();
        string _carid =binCS.smartCar.getcarid();
        string _panid =binCS.smartCar.getpanid();
        fout2<<_id<<" "<<_name<<" "<<_carid<<" "<<_panid<<endl;// 分配信息保存至此
        
        fout2.close();
    }
    //按照小车编号查询分配信息（没有分配的就不显示学生信息，分配了的显示学生信息），这里就只实现所有小车都分配的情况
    cout<<"按n键查看下一辆小车，按p键查看上一辆小车，q退出：";
    int b=0;
    for(;;)
    {
        
        char a = cin.get();
        if(a=='n')//按n展示上一信息
        {
            
            if(b>=number_of_car)
            {
                b=number_of_car-1;
            }
            BindCS c=v3[allocated_car[b]];
            cout << "##########################################智能小车信息如下##################################"<<endl;
            c.smartCar.print();
            c.student.print();

            ifstream infile1;//接下来展示静态信息 这里按照题目第四问是根据文件读取；
            infile1.open("staticInformation_of_car.txt", ios::in);
            char buf[1024];
            while (infile1.getline(buf,sizeof(buf)))
            {
                cout << buf << endl;
            }
            b=b+1;
        }else if(a=='p'){//按p展示下一信息
            //抵消循环自动+1
            b--;//实现上一位置；
            if(b<0)
            {
                b=0;
            }
            
            BindCS c=v3[allocated_car[b]];
            cout << "##########################################智能小车信息如下##################################"<<endl;
            c.smartCar.print();
            c.student.print();
            ifstream infile1;//接下来展示静态信息 
            infile1.open("staticInformation_of_car.txt", ios::in);
            char buf[1024];
            while (infile1.getline(buf,sizeof(buf)))
            {
                cout << buf << endl;
            }
            
        }else if(a=='q'){//按q退出
            break;
        }
    }

}


